From 6873f06b872dd0ae63559d81886c3f089bf9467d Mon Sep 17 00:00:00 2001 From: "maf46@burn.cl.cam.ac.uk" Date: Fri, 25 Feb 2005 14:47:52 +0000 Subject: [PATCH] bitkeeper revision 1.1236.3.2 (421f3a985MlpKQbJ61Hi9J-7qp0NCg) Make show_registers() aware of vmx guest contexts. Signed-off-by: michael.fetterman@cl.cam.ac.uk --- xen/arch/x86/x86_32/entry.S | 1 + xen/arch/x86/x86_32/traps.c | 70 ++++++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S index b47edf86f8..7d3411ef42 100644 --- a/xen/arch/x86/x86_32/entry.S +++ b/xen/arch/x86/x86_32/entry.S @@ -99,6 +99,7 @@ pushl $VMX_MONITOR_EFLAGS; \ popf; \ subl $(NR_SKIPPED_REGS*4), %esp; \ + movl $0, 0xc(%esp); /* eflags==0 identifies xen_regs as VMX guest */ \ pushl %eax; \ pushl %ebp; \ pushl %edi; \ diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index 68463a253c..e45ba20f0f 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -9,6 +9,10 @@ #include #include +#ifdef CONFIG_VMX +#include +#endif + /* All CPUs have their own IDT to allow set_fast_trap(). */ idt_entry_t *idt_tables[NR_CPUS] = { 0 }; @@ -88,37 +92,63 @@ void show_stack(unsigned long *esp) void show_registers(struct xen_regs *regs) { - unsigned long esp; - unsigned short ss, ds, es, fs, gs; + unsigned long ss, ds, es, fs, gs, cs; + unsigned long eip, esp, eflags; + const char *context; - if ( GUEST_MODE(regs) ) +#ifdef CONFIG_VMX + if ( current->arch.arch_vmx.flags && (regs->eflags == 0) ) { - esp = regs->esp; - ss = regs->ss & 0xffff; - ds = regs->ds & 0xffff; - es = regs->es & 0xffff; - fs = regs->fs & 0xffff; - gs = regs->gs & 0xffff; + __vmread(GUEST_EIP, &eip); + __vmread(GUEST_ESP, &esp); + __vmread(GUEST_EFLAGS, &eflags); + __vmread(GUEST_SS_SELECTOR, &ss); + __vmread(GUEST_DS_SELECTOR, &ds); + __vmread(GUEST_ES_SELECTOR, &es); + __vmread(GUEST_FS_SELECTOR, &fs); + __vmread(GUEST_GS_SELECTOR, &gs); + __vmread(GUEST_CS_SELECTOR, &cs); + context = "vmx guest"; } else +#endif { - esp = (unsigned long)(®s->esp); - ss = __HYPERVISOR_DS; - ds = __HYPERVISOR_DS; - es = __HYPERVISOR_DS; - fs = __HYPERVISOR_DS; - gs = __HYPERVISOR_DS; + eip = regs->eip; + eflags = regs->eflags; + + if ( GUEST_MODE(regs) ) + { + esp = regs->esp; + ss = regs->ss & 0xffff; + ds = regs->ds & 0xffff; + es = regs->es & 0xffff; + fs = regs->fs & 0xffff; + gs = regs->gs & 0xffff; + cs = regs->cs & 0xffff; + context = "guest"; + } + else + { + esp = (unsigned long)(®s->esp); + ss = __HYPERVISOR_DS; + ds = __HYPERVISOR_DS; + es = __HYPERVISOR_DS; + fs = __HYPERVISOR_DS; + gs = __HYPERVISOR_DS; + cs = __HYPERVISOR_CS; + + context = "hypervisor"; + } } - printk("CPU: %d\nEIP: %04lx:[<%p>] \nEFLAGS: %p\n", - smp_processor_id(), 0xffff & regs->cs, regs->eip, regs->eflags); + printk("CPU: %d\nEIP: %04lx:[<%p>] \nEFLAGS: %p CONTEXT: %s\n", + smp_processor_id(), 0xffff & regs->cs, eip, eflags, context); printk("eax: %p ebx: %p ecx: %p edx: %p\n", regs->eax, regs->ebx, regs->ecx, regs->edx); printk("esi: %p edi: %p ebp: %p esp: %p\n", regs->esi, regs->edi, regs->ebp, esp); - printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", - ds, es, fs, gs, ss); - printk("cr3: %08lx\n", read_cr3()); + printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x cs: %04x\n", + ds, es, fs, gs, ss, cs); show_stack((unsigned long *)®s->esp); } -- 2.30.2